#ifndef __SG_PCL_BASE_INFO_H__
#define __SG_PCL_BASE_INFO_H__

#pragma warning(push)
#include <Eigen/Sparse>
#include <Eigen/Dense>
#pragma warning(pop)

#include <pcl/point_cloud.h>
#include <pcl/point_types.h>

#include "../../utility/SGException.h"
#include "../../utility/SGLog.h"
#include "../../utility/SGTimer.h"

typedef float SGFloat;

//typedef Eigen::Matrix<SGFloat, -1, -1, Eigen::RowMajor>
//  SGMatrixX; // 浮点矩阵，坐标一般以行存储，行优先可以提高效率
//typedef Eigen::Matrix<int, -1, -1, Eigen::RowMajor>
//  SGMatrixXI; // 整型矩阵，坐标一般以行存储，行优先可以提高效率
//typedef Eigen::Matrix<SGFloat, 1, -1> SGRowVectorX; // 浮点行向量
//typedef Eigen::Matrix<int, 1, -1> SGRowVectorXI;    // 整形行向量
//typedef Eigen::Matrix<SGFloat, -1, 1> SGVectorX;    // 浮点列向量
//typedef Eigen::Matrix<int, -1, 1> SGVectorXI;       // 整形列向量
//typedef Eigen::Matrix<SGFloat, 3, 1> SGCoordX;      // 单精度三维坐标
//typedef Eigen::Matrix<SGFloat, 1, 3> SGRowCoordX;   // 单精度三维坐标(行向量)
//typedef Eigen::SparseMatrix<SGFloat, Eigen::RowMajor> SGSparseMatrix; // 双精度稀疏矩阵

constexpr SGFloat SGC_PI = static_cast<SGFloat>(3.1415926535897942454626);
constexpr SGFloat SGC_2PI = static_cast<SGFloat>(SGC_PI * 2);
constexpr SGFloat SGC_PI_2 = static_cast<SGFloat>(SGC_PI * 0.5);
constexpr SGFloat SGC_RAD_TO_DEG = static_cast<SGFloat>(180. / SGC_PI);
constexpr SGFloat SGC_DEG_TO_RAD = static_cast<SGFloat>(SGC_PI / 180.);
constexpr SGFloat SGC_TOL = static_cast<SGFloat>(1e-10);


#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(_WIN64) ||                  \
  defined(_WINDOWS) || defined WINCE || defined __MINGW32__

#ifdef SGPCL_EXPORTS
#define SGPCL_API __declspec(dllexport)
#else
#define SGPCL_API __declspec(dllimport)
#endif

#else
// Linux编译环境

#define SGPCL_EXPORTS

#endif

#endif
